﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<!-- Copyright 2005 Macromedia, Inc. All rights reserved. -->
<title>测试文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="../css/mm_training.css" type="text/css" />
<style type="text/css">
<!--
.STYLE1 {font-size: 12px}
-->
</style>
</head>
<body bgcolor="#64748B">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr bgcolor="#26354A">
	<td width="15" nowrap="nowrap"><img src="../css/mm_spacer.gif" alt="" width="15" height="1" border="0" /></td>
	<td height="70" colspan="2" nowrap="nowrap" bgcolor="#26354A" class="logo">ABC-DB说明手册</td>
	<td width="25" bgcolor="#26354A">&nbsp;</td>
  </tr>

	<tr bgcolor="#FF6600">
	<td colspan="4"><img src="../css/mm_spacer.gif" alt="" width="1" height="4" border="0" /></td>
	</tr>

	<tr bgcolor="#D3DCE6">
	<td colspan="4"><img src="../css/mm_spacer.gif" alt="" width="1" height="1" border="0" /></td>
	</tr>

	<tr bgcolor="#FFCC00">
	<td width="15" nowrap="nowrap" bgcolor="#FFFF99">&nbsp;</td>
	<td height="24" colspan="2" bgcolor="#FFFF99">
	<table border="0" cellpadding="0" cellspacing="0" id="navigation">
        <tr>
          <td class="navText" align="center" nowrap="nowrap"><a href="../index.html">主页</a></td>
          <td class="navText" align="center" nowrap="nowrap"><a href="requiemention.html">需求规格说明书</a></td>
          <td class="navText" align="center" nowrap="nowrap"><a href="manual.html">系统说明与安装手册</a></td>
          <td class="navText" align="center" nowrap="nowrap"><a href="order.html">系统命令手册</a></td>
          <td class="navText" align="center" nowrap="nowrap"><a href="code.html">设计说明</a></td>
          <td class="navText" align="center" nowrap="nowrap"><a href="exp.html">测试文档</a></td>
          <td class="navText" align="center" nowrap="nowrap"><a href="tutl.html">一个运行实例</a></td>
<td class="navText" align="center" nowrap="nowrap"><a href="need-imp.html">不足之处</a></td>
        </tr>
      </table>	</td>
	<td width="25" bgcolor="#FFFF99">&nbsp;</td>
  </tr>

	<tr bgcolor="#D3DCE6">
	<td colspan="4"><img src="../css/mm_spacer.gif" alt="" width="1" height="1" border="0" /></td>
	</tr>

	<tr bgcolor="#FF6600">
	<td colspan="4"><img src="../css/mm_spacer.gif" alt="" width="1" height="4" border="0" /></td>
	</tr>

	<tr bgcolor="#D3DCE6">
	<td colspan="4"><img src="../css/mm_spacer.gif" alt="" width="1" height="1" border="0" /></td>
	</tr>

	<tr bgcolor="#D3DCE6">
	<td colspan="3" valign="top"><img src="../css/mm_spacer.gif" alt="" width="35" height="1" border="0" /><br />
	&nbsp;
	<table width="100%" border="0" align="center" cellpadding="2" cellspacing="0">
      <tr>
        <td class="pageName"><div align="center">测试文档</div></td>
      </tr>
      <tr>
        <td class="bodyText"><hr />
        
        索引目录:<br />
           1.<a href="#one">测试约定与说明</a><br />
           &nbsp; &nbsp;1.1.<a href="#one1">查询时间约定</a><br />
           &nbsp; &nbsp;1.2.<a href="#one2">测试机型配置</a><br />
           &nbsp; &nbsp;1.3.<a href="#one3">测试数据表</a><br />
           2.<a href="#two">性能测试</a><br />
           &nbsp; &nbsp;1.1.<a href="#two11">普通测试</a><br />
           &nbsp; &nbsp;&nbsp; &nbsp;1.1.1<a href="#two11">从磁盘导入内存性能</a><br />
           &nbsp; &nbsp;&nbsp; &nbsp;1.1.2<a href="#two12">查询响应时间</a><br />
           &nbsp; &nbsp;&nbsp; &nbsp;1.1.3<a href="#two13">更新响应时间</a><br />
           &nbsp; &nbsp;&nbsp; &nbsp;1.1.4<a href="#two14">删除响应时间</a><br />
           &nbsp; &nbsp;&nbsp; &nbsp;1.1.5<a href="#two15">插入响应时间</a><br />
           3.<a href="#three">块大小的不同对于整体性能的影响</a><br />
           4.<a href="#four">异常处理</a><br />
           &nbsp; &nbsp;4.1<a href="#four1">服务端启动</a><br />
           &nbsp; &nbsp;4.2<a href="#four2">客户端连接</a><br />
           &nbsp; &nbsp;4.3<a href="#four3">程序运行时的输入错误</a><br />
           &nbsp; &nbsp;4.4<a href="#four4">服务端打开指定数据库</a><br />
           &nbsp; &nbsp;4.5<a href="#four5">服务端没有打开任何数据库的情况下执行某些指令</a><br />
           &nbsp; &nbsp;4.6<a href="#four6">输入错误的指令</a><br />
           &nbsp; &nbsp;4.7<a href="#four7">SQL语句中的一些输入错误</a><br />
           5.<a href="#five">一个测试(并发)实例</a><br />
		<hr>
        <h3 align="center" class="STYLE1"><a name="one" id="one"></a>1.测试约定与说明</h3>
        <h3 class="STYLE1"><a name="one1" id="one1"></a>1.1.查询时间约定:</h3>
     
          <span class="STYLE1">本系统中的查询时间均指从用户输入完命令，按下回车开始，直至所有操作(包括输出)完成所耗费的时间。
          </p>
          </span>
          <h3 class="STYLE1"><a name="one2" id="one2"></a>1.2.测试机型配置:</h3>

          <span class="STYLE1">cpu :Pentium(R) Dual-Core CPU E6300 @ 2.80GHz<br />
          mem :2038912 kB<br />
          disk:320.0 GB
          </p>
          </span>
          <h3 class="STYLE1"><a name="one3" id="one3"></a>1.3.测试数据表:</h3>
        
          <span class="STYLE1">create table list(call_id varchar(30),call_from varchar(20),call_from_place varchar(10),call_to varchar(20),call_to_place varchar(10),call_start varchar(20),call_end varchar(20),switch_id integer(10),switch_type integer(10));
          </p>
          </span>
          <p class="STYLE1">共10万条记录，每条记录约90字节左右</p>
        <hr>
          <h3 align="center"><span class="STYLE1"><a name="two" id="two"></a>2.性能测试</span><br />
          </h3>
          <p class="STYLE1"><a name="two1" id="two1"></a>2.1.普通测试:<br />
            <a name="two11" id="two11"></a>2.1.1.从磁盘导入内存性能<br />
            打开数据库，并且导入数据:<br />
            loading data from list...<br />
            command costs 4380926 us</p>
          <p class="STYLE1">耗时4380926us,约为4.38秒，因此批量加载的效率约为22831条/秒</p>
          <p class="STYLE1"><a name="two12" id="two12"></a>2.1.2.查询响应时间:<br />
            a.select * from list where switch_type=33;<br />
            执行两次<br />
            第一次查询得到986条记录，查询耗时210685us，相应时间约为2.1us/条<br />
            第二次查询得到986条记录，查询耗时224484us，相应时间约为2.2us/条</p>
          <p class="STYLE1">b.select * from list where call_id=&quot;xxxxx&quot;;<br />
            执行两次<br />
            第一次查询得到0条记录，查询耗时90449us，相应时间约为0.9us/条<br />
            第二次查询得到0条记录，查询耗时92060us，相应时间约为0.9us/条</p>
          <p class="STYLE1">c.select * from list;<br />
            执行两次<br />
            第一次查询得到100000条记录，查询耗时3847087us，相应时间约为38.47us/条<br />
            第二次查询得到100000条记录，查询耗时5211732us，相应时间约为52.11us/条<br />
            由于输出的时间也算在内，因此输出10万条记录的耗时大部分花在了输出上.</p>
          <p class="STYLE1"><a name="two13" id="two13"></a>2.1.3.更新响应时间:<br />
  a.update list set call_id=&quot;1111&quot;;<br />
            执行两次<br />
            第一次更改100000条记录，查询耗时981669us，相应时间约为9.81us/条<br />
            第二次更改100000条记录，查询耗时956509us，相应时间约为9.56us/条</p>
          <p class="STYLE1">b.update list set switch_type=11;<br />
            执行两次<br />
            第一次更改100000条记录，查询耗时994513us，相应时间约为9.94us/条<br />
            第二次更改100000条记录，查询耗时1023922us，相应时间约为10.23us/条</p>
          <p class="STYLE1"><a name="two14" id="two14"></a>2.1.4.删除响应时间:<br />
            a.delete from list;<br />
            执行两次<br />
            第一次删除100000条记录，查询耗时9935us，相应时间约为0.99us/条<br />
            第二次删除100000条记录，查询耗时9224us，相应时间约为0.92us/条</p>
          <p class="STYLE1"><a name="two15" id="two15"></a>2.1.5.插入响应时间:<br />
  a.insert into list values(&quot;1000487&quot;,&quot;13511063484&quot;,&quot;5110&quot;,&quot;13272052072&quot;,&quot;2720&quot;,&quot;2008-10-10 14:45:46&quot;,&quot;2008-10-10 15:02:05&quot;,7831,31);<br />
            第一次，当list表为空的情况下，插入耗时84us.<br />
            爹如此，当list表有10万条记录的情况下，插入us74us.<hr />
            <h3 align="center" class="STYLE1"><a name="three" id="three"></a>3.块大小的不同对于整体性能的影响</h3>
              <span class="STYLE1">在系统设计中，对底层共享内存中，存放数据记录的区域我们进行了逻辑上的分块处理，现在我们进行测试，查看块的大小对于系统性能的影响如何。              </span>
            <p class="STYLE1">测试方案:<br />
            1.5.1.块分为2KB、4KB、8KB三种方案,数据库中只有单张表</p>
          <p class="STYLE1">1.5.2.测试数据表:<br />
            create table list(call_id varchar(30),call_from varchar(20),call_from_place varchar(10),call_to varchar(20),call_to_place varchar(10),call_start varchar(20),call_end varchar(20),switch_id integer(10),switch_type integer(10));<br />
            共10万条记录，每条记录约90字节左右</p>
          <p class="STYLE1">1.5.3.测试命令类型:<br />
            a.导入10万条记录到数据库的时间<br />
            b.select * from list where call_id=&quot;34&quot;;<br />
            c.select * from list where switch_type=45;<br />
            d.insert into list values(&quot;1000487&quot;,&quot;13511063484&quot;,&quot;5110&quot;,&quot;13272052072&quot;,&quot;2720&quot;,&quot;2008-10-10 14:45:46&quot;,&quot;2008-10-10 15:02:05&quot;,7831,31);<br />
            e.delete from list where switch_type&lt;34;<br />
            f.导入5000条记录<br />
            g.update list set call_id=&quot;1111&quot;;</p>
          <p class="STYLE1">测试结果(单位是us)<br />
            1.2KB<br />
            a:4322199<br />
            b:91499<br />
            c:227622<br />
            d:53<br />
            e:103985<br />
            f:4262<br />
            table has 10000 blocks,65876 records,34124 free records（导入前表信息）<br />
            table has 10000 blocks,70874 records,29126 free records（导入后表信息）<br />
            g:697226</p>
          <p class="STYLE1">2.4KB<br />
            a:1060670<br />
            b:88246<br />
            c:235726<br />
            d:49<br />
            e:102097<br />
            f:4397<br />
            table has 4762 blocks,65876 records,34126 free records（导入前表信息）<br />
            table has 4762 blocks,70874 records,29128 free records（导入后表信息）<br />
            g:706737</p>
          <p class="STYLE1">3.8KB<br />
            a:312994<br />
            b:92247<br />
            c:215210<br />
            d:77<br />
            e:100871<br />
            f:4631<br />
            table has 2381 blocks,65876 records,34126 free records（导入前表信息）<br />
            table has 2381 blocks,70874 records,29128 free records（导入后表信息）<br />
            g:704847</p>
          <p class="STYLE1">因此可以得出结论:导入方面，块的大小越大，导入的速度越快。查询方面则影响很小。<hr>
          <h3 align="center" class="STYLE1"><a name="four" id="four"></a>4.异常处理</h3>
          <p class="STYLE1">引言:<br />
            本文档简单描述系统在遇到各种错误时的相应处理情况。</p>
          <p class="STYLE1"><a name="four1" id="four1"></a>4.1.服务端启动<br />
            服务端启动时会检测所需的端口(在def_head.h文件中定义)是否被占用，如果被占用，则启动失败，返回出错信息，退出程序。</p>
          <p class="STYLE1"><a name="four2" id="four2"></a>4.2.客户端连接<br />
            客户端尝试连接指定的服务器，如果指定的服务器没有启动或者有网络故障，则客户端连接失败，返回出错信息，退出程序。</p>
          <p class="STYLE1"><a name="four3" id="four3"></a>4.3.程序运行时的输入错误<br />
            程序运行时，在一些地方，如打开数据库时要求</p>
          <p class="STYLE1"><a name="four4" id="four4"></a>4.4.服务端打开指定数据库<br />
            a.如果输入了不存在的数据库名称，则显示数据库不存在，返回。<br />
            b.如果输入的密码不正确，则显示相应出错信息，返回。<br />
            c.如果磁盘上数据字典文件不存在，则显示读取字典文件失败，返回。<br />
            d.如果读取的字典文件中有格式错误，遇到这种情况，程序没有能力做进一步判断，可能会造成不确定的错误。<br />
            e.如果欲打开的数据库所需要的内存大小比当前系统规定的最大共享内存大小大，则提示创建共享内存失败，退出程序。</p>
          <p class="STYLE1"><a name="four5" id="four5"></a>4.5.服务端没有打开任何数据库的情况下执行某些指令<br />
            系统中很多指令，如info、load、save、所有的SQL语句等，都需要在已有数据库打开的情况下执行，如果当前没有打开任何数据库，执行这些指令，则会给出相应出错信息，并返回。</p>
          <p class="STYLE1"><a name="four6" id="four6"></a>4.6.输入错误的指令<br />
            如果任意输入一个不存在的指令，则系统无法识别，提示相应的错误，返回。</p>
          <p class="STYLE1"><a name="four7" id="four7"></a>4.7.SQL语句中的一些输入错误(注:以下仅以查询为例，但更新、删除等操作均同样)<br />
            查询不存在的表<br />
            例:$:select * from xxx;<br />
            table not exist<br />
            <br />
            查询不存在的列<br />
            例:$:select xxx from list;<br />
            field not exist</p>
          <p class="STYLE1"> 表和列都不存在<br />
            例:$:select xxx from yyy;<br />
            table not exist</p>
          <p class="STYLE1"> 插入的类型不匹配<br />
            例:$:insert into list(call_id) values(11111);   //call_id是varchar类型，但是插入的数据是integer类型<br />
            a field type error:should not be INTEGER<hr>
            <h3 align="center" class="STYLE1"><a name="five" id="five"></a>5.一个测试(并发)实例</h3>
            <p class="STYLE1">注:源代码见“并发测试”目录，编译其下的makefile文件便可。</p>
            <p class="STYLE1">本程序用以测试数据库的并发性,测试程序中,通过产生随机数的方式，每次来随机调用以下sql语句中的任意一个，一共将创建了四个线程。</p>
            <p class="STYLE1">select * from list where switch_type=44;<br />
              delete from list;<br />
              update list set switch_type=55;<br />
            </p>
            <p class="STYLE1">四个线程非别对同一张表list执行更新，查询，删除，查询四个操作，由于线程的创建时间很短，外加上一些因素，所以这四个线程的执行顺序并不一定按照创建的前后顺序，而是无序的。</p>
            <p class="STYLE1">测试2次，结果如下:</p>
            <p class="STYLE1">第一次:<br />
             <p align="center"><img src="mult1.png"></p>
            <p class="STYLE1">第二次:<br />
             <p align="center"><img src="mult2.png"></p>
            <p><span class="STYLE1">我们来分析一下<br>第一次执行的结果是两次select都没有查询到数据，另外执行了两次update或者delete操作，具体我们不得而知。但此时在服务端我们查看数据库可以看到list表还是有10万条记录，也就是说没有执行delete语句，于是我们就可以知道，第一条执行的语句肯定是update，导致后面的两条select都查不到结果，因为update把每条记录的switch_type都改成了55，都select是查询switch_type为22的记录，故都查不到了。这里可以看出，并发是有效的。<br />
            第二次查询道理同第一次。</span><br />
            </p>
            </td>
      </tr>
    </table>
	<br /> 	<br />	</td>
	<td>&nbsp;</td>
	</tr>

	
</table>
</body>
</html>

